//-----------------------------------------------------------------------------
// COMPILE-TIME OPTIONS FOR DEAR IMGUI
// Runtime options (clipboard callbacks, enabling various features, etc.) can generally be set via the ImGuiIO
// structure. You can use ImGui::SetAllocatorFunctions() before calling ImGui::CreateContext() to rewire memory
// allocation functions.
//-----------------------------------------------------------------------------
// A) You may edit imconfig.h (and not overwrite it when updating imgui, or maintain a patch/branch with your
// modifications to imconfig.h) B) or add configuration directives in your own file and compile with #define
// IMGUI_USER_CONFIG "myfilename.h" If you do so you need to make sure that configuration settings are defined
// consistently _everywhere_ dear imgui is used, which include the imgui*.cpp files but also _any_ of your code that
// uses imgui. This is because some compile-time options have an affect on data structures. Defining those options in
// imconfig.h will ensure every compilation unit gets to see the same data structure layouts. Call IMGUI_CHECKVERSION()
// from your .cpp files to verify that the data structures your files are using are matching the ones imgui.cpp is
// using.
//-----------------------------------------------------------------------------

#pragma once

#include "saiga/core/math/math.h"
#include "saiga/core/util/assert.h"

//---- Define assertion handler. Defaults to calling assert().
#define IM_ASSERT(_EXPR) SAIGA_ASSERT(_EXPR)

//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows.
#define IMGUI_API SAIGA_CORE_API
#define IMGUI_IMPL_API SAIGA_LOCAL

//---- Don't define obsolete functions/enums names. Consider enabling from time to time after updating to avoid using
// soon-to-be obsolete function/names. #define IMGUI_DISABLE_OBSOLETE_FUNCTIONS

//---- Don't implement demo windows functionality (ShowDemoWindow()/ShowStyleEditor()/ShowUserGuide() methods will be
// empty)
//---- It is very strongly recommended to NOT disable the demo windows during development. Please read the comments in
// imgui_demo.cpp. #define IMGUI_DISABLE_DEMO_WINDOWS

//---- Don't implement some functions to reduce linkage requirements.
//#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS   // [Win32] Don't implement default clipboard handler. Won't
// use and link with OpenClipboard/GetClipboardData/CloseClipboard etc. #define
// IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS
//// [Win32] Don't implement default IME handler. Won't use and link with ImmGetContext/ImmSetCompositionWindow. #define
// IMGUI_DISABLE_WIN32_FUNCTIONS                     // [Win32] Won't use and link with any Win32 function. #define
// IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS             // Don't implement ImFormatString/ImFormatStringV so you can
// implement them yourself if you don't want to link with vsnprintf. #define IMGUI_DISABLE_MATH_FUNCTIONS // Don't
// implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 wrapper so you can implement them yourself. Declare
// your prototypes in imconfig.h. #define IMGUI_DISABLE_DEFAULT_ALLOCATORS                  // Don't implement default
// allocators calling malloc()/free() to avoid linking with them. You will need to call ImGui::SetAllocatorFunctions().

//---- Include imgui_user.h at the end of imgui.h as a convenience
#define IMGUI_INCLUDE_IMGUI_USER_H

//---- Pack colors to BGRA8 instead of RGBA8 (to avoid converting from one to another)
//#define IMGUI_USE_BGRA_PACKED_COLOR

//---- Avoid multiple STB libraries implementations, or redefine path/filenames to prioritize another version
// By default the embedded implementations are declared static and not available outside of imgui cpp files.
//#define IMGUI_STB_TRUETYPE_FILENAME   "my_folder/stb_truetype.h"
//#define IMGUI_STB_RECT_PACK_FILENAME  "my_folder/stb_rect_pack.h"
//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION
//#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION

//---- Define constructor and implicit cast operators to convert back<>forth between your math types and ImVec2/ImVec4.
// This will be inlined as part of ImVec2 and ImVec4 class declarations.

#define IM_VEC2_CLASS_EXTRA                                    \
    ImVec2(const Saiga::vec2& f)                               \
    {                                                          \
        x = f[0];                                              \
        y = f[1];                                              \
    }                                                          \
    operator Saiga::vec2() const { return Saiga::vec2(x, y); } \
    ImVec2 operator+(ImVec2 b) { return ImVec2(x + b.x, y + b.y); }


#define IM_VEC3_CLASS_EXTRA      \
    ImVec3(const Saiga::vec3& f) \
    {                            \
        x = f[0];                \
        y = f[1];                \
        z = f[2];                \
    }                            \
    operator Saiga::vec3() const { return Saiga::vec3(x, y, z); }

#define IM_VEC4_CLASS_EXTRA      \
    ImVec4(const Saiga::vec4& f) \
    {                            \
        x = f[0];                \
        y = f[1];                \
        z = f[2];                \
        w = f[3];                \
    }                            \
    operator Saiga::vec4() const { return Saiga::vec4(x, y, z, w); }

#define IM_QUAT_CLASS_EXTRA              \
    ImQuat(const Saiga::quat& f)         \
    {                                    \
        auto v = Saiga::quat_to_vec4(f); \
        x      = v[0];                   \
        y      = v[1];                   \
        z      = v[2];                   \
        w      = v[3];                   \
    }                                    \
    operator Saiga::quat() const { return Saiga::make_quat(x, y, z, w); }

#define IMGUI_DEFINE_MATH_OPERATORS

//---- Use 32-bit vertex indices (default is 16-bit) to allow meshes with more than 64K vertices. Render function needs
// to support it. #define ImDrawIdx unsigned int

//---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files.
/*
namespace ImGui
{
    void MyFunction(const char* name, const MyMatrix44& v);
}
*/
